home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995…tember: Reference Library / Dev.CD Sep 95 RL / Dev.CD Sep 95 RL.toast / mac / Technical Documentation / develop / develop Issue 8 code / AUX Hybrid Apps / AUX System Calls / src / execvp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-09  |  1.9 KB  |  110 lines  |  [TEXT/tefi]

  1. /*    @(#)execvp.c    2.1     */
  2. /*    3.0 SID #    1.2    */
  3. /*LINTLIBRARY*/
  4. /*
  5.  *    auxexeclp(name, arg,...,0)    (like auxexecl, but does path search)
  6.  *    auxexecvp(name, argv)    (like auxexecv, but does path search)
  7.  */
  8. #include <LibAUX.h>
  9. #include </:usr:include:limits.h>
  10. #include </:usr:include:varargs.h>
  11.  
  12. #ifndef NULL
  13. #define    NULL        0
  14. #endif
  15. #define    MAXARGS        256
  16.  
  17. static char *execat(), shell[] = "/bin/sh";
  18. extern char *auxgetenv(), *strchr();
  19. int strlen(), GetAUXErrno(), auxexecv();
  20. void SetAUXErrno();
  21.  
  22. /*VARARGS1*/
  23. int
  24. auxexeclp(name,va_alist)
  25. char *name;
  26. va_dcl
  27. {
  28.     va_list ap;
  29.     char *args[MAXARGS];
  30.     int count = 0;
  31.  
  32.     va_start(ap);
  33.     while ((args[count++] = va_arg(ap, char *)) != (char *) NULL)
  34.         continue;
  35.     va_end(ap);
  36.     return(auxexecvp(name, args));
  37. }
  38.  
  39. int
  40. auxexecvp(name, argv)
  41. char    *name, **argv;
  42. {
  43.     char    *pathstr;
  44.     char    fname[2 * PATH_MAX];
  45.     char    *newargs[MAXARGS];
  46.     int    i;
  47.     register char    *cp;
  48.     register unsigned etxtbsy=1;
  49.     register int eacces=0;
  50.     long error;
  51.  
  52.     if (strlen(name) > PATH_MAX) {
  53.         SetAUXErrno(ENAMETOOLONG);
  54.         return(-1);
  55.     }
  56.  
  57.     if((pathstr = auxgetenv("PATH")) == NULL)
  58.         pathstr = ":/bin:/usr/bin";
  59.     cp = strchr(name, '/')? "": pathstr;
  60.  
  61.     do {
  62.         cp = execat(cp, name, fname);
  63.     retry:
  64.         (void) auxexecv(fname, argv);
  65.         error = GetAUXErrno();
  66.         switch(error) {
  67.         case ENOEXEC:
  68.             newargs[0] = "sh";
  69.             newargs[1] = fname;
  70.             for(i=1; newargs[i+1]=argv[i]; ++i) {
  71.                 if(i >= (MAXARGS - 2)) {
  72.                     SetAUXErrno(E2BIG);
  73.                     return(-1);
  74.                 }
  75.             }
  76.             (void) auxexecv(shell, newargs);
  77.             return(-1);
  78.         case ETXTBSY:
  79.             return(-1);
  80.         case EACCES:
  81.             ++eacces;
  82.             break;
  83.         case ENOMEM:
  84.         case E2BIG:
  85.             return(-1);
  86.         }
  87.     } while(cp);
  88.     if(eacces)
  89.         SetAUXErrno(EACCES);
  90.     return(-1);
  91. }
  92.  
  93. static char *
  94. execat(s1, s2, si)
  95. register char *s1, *s2;
  96. char    *si;
  97. {
  98.     register char    *s;
  99.  
  100.     s = si;
  101.     while(*s1 && *s1 != ':')
  102.         *s++ = *s1++;
  103.     if(si != s)
  104.         *s++ = '/';
  105.     while(*s2)
  106.         *s++ = *s2++;
  107.     *s = '\0';
  108.     return(*s1? ++s1: 0);
  109. }
  110.